package com.baizhi.cmfz.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Aspect
@Configuration
public class CacheAspect {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 添加缓存 * 1.判断要得到的数据在缓存中有没有 *
     * 2.没有的话 查询数据 查询结果放到缓存中     自定义注解
     * 3.有的话 直接把缓存的结果 返回 ** 环绕增强 需要放行操作 可以获取方法执行的返回值
     */
    @Around("@annotation(com.baizhi.cmfz.annotation.addCacheAnnotation)")
    public Object addCache(ProceedingJoinPoint joinPoint) throws Throwable {
        //判断要得到的数据是否在缓存中
        //没有的话 查询数据 查询结果放在缓存中
        //有的话直接从缓存中获取
        //执行放行操作 查询数据库 就是被切的方法执行的返回值结果
        String className = joinPoint.getTarget().getClass().getName();
        System.out.println("类名" + className);
        //获取方法名+形参的值
        StringBuffer stringBuffer = new StringBuffer();
        String methodName = joinPoint.getSignature().getName();
        stringBuffer.append(methodName);
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            System.out.println(arg);
        }
        String hashKey = stringBuffer.toString();
        System.out.println("hashKey" + hashKey);
        HashOperations hashOperations = redisTemplate.opsForHash();
        Object result = hashOperations.get(className, hashKey);
        if (result == null) {
            System.out.println("查询数据库");
            result = joinPoint.proceed();
            Map map = new HashMap<>();
            map.put(hashKey, result);
            hashOperations.putAll(className, map);
            //设置失效时间
            redisTemplate.expire(className, 10, TimeUnit.SECONDS);
        } else {
            System.out.println("缓存数据");
        }
        return result;
    }

    @Before("@annotation(com.baizhi.cmfz.annotation.DeleteCacheAnnotation)")
    public void deleteCache(JoinPoint joinPoint) {
        /*** 执行删除缓存 */
        System.out.println("删除缓存");
        // 1.获取类名
        String className = joinPoint.getTarget().getClass().getName();
        System.out.println("要删除的类名：" + className);
        // 2.删除
        // redisTemplate.delete(className); } }
    }
}